#ifndef DSPNASM_SEGLIST_H
#define DSPNASM_SEGLIST_H

#include <vector>
#include <string>
#include "lit/elf/block.h"

class ElfFile;

// 同类型段列表
struct SegList {
    u32 baseAddr; // 虚拟段基地址
    u32 begin;    // 对齐前elf文件偏移
    u32 offset;   // 对齐后elf文件偏移
    u32 size;     // 总大小
    std::vector<std::shared_ptr<ElfFile>> ownerList;  // 所有者列表
    std::vector<std::shared_ptr<Block>> blocks;       // 数据块

    /**
     * 段地址空间分配
     * @param segName 段名
     * @param base 段基地址
     * @param off 段偏移量
     */
    void allocAddr(const std::string &segName, u32 &base, u32 &off);

    /**
     * 重定位
     * @param relAddr 重定位地址
     * @param type 符号类型
     * @param symAddr 符号地址
     */
    void relocAddr(u32 relAddr, u8 type, u32 symAddr);
};

#endif //DSPNASM_SEGLIST_H
